package com.jojo.jojomall.search.service.impl;

import com.alibaba.fastjson.JSON;
import com.jojo.common.to.es.skuEsModel;
import com.jojo.jojomall.search.config.jojomallElasticConfig;
import com.jojo.jojomall.search.service.ProductSaveService;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
public class ProductSaveServiceImpl implements ProductSaveService {
//    1.1注入要使用的操控es的类
    @Autowired
    RestHighLevelClient restHighLevelClient;
    @Override
    public Boolean productStartUp(List<skuEsModel> skuEsModels) throws IOException {

        //1.1.1保存到es中
//        1，建立索引  详情见res下的mapping资源，这里直接在kibana下操作完成

//        2,在es中保存数据；大批的意思->bulk
//        2.1 因为我们要用restHighLevelClient来存储数据，还要一下子村很多所以我们用bulk方法
//        我们创建一个新的bulkrequest 集合来储存我们所要施加的请求；
        BulkRequest bulkRequest = new BulkRequest();
//        我们将每一条sku信息都用for存储到bulkR里
        for (skuEsModel skuEsModel : skuEsModels) {
//            建立一个存储请求
            IndexRequest index = new IndexRequest();
//            放入唯一的id值
            index.id(skuEsModel.getSkuId().toString());
//                    放入source里内容也就是 每一条sku信息的json数据
            String jsonString = JSON.toJSONString(skuEsModel);
            index.source(jsonString, XContentType.JSON);
//            将信息放进bulk里
            bulkRequest.add(index);//完成
        }
//        将集合了众多存储请求的bulk集合使用操作段完成操作
        BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, jojomallElasticConfig.COMMON_OPTIONS);
        boolean b = bulk.hasFailures();//是否有批量错误；
//        TODO 如果批量错误
//        获得错误集合们
        List<BulkItemResponse> succ = Arrays.asList(bulk.getItems());
//        将错误的属性的id汇成集合
        List<String> succIdList = succ.stream().map(item -> item.getId()).collect(Collectors.toList());
        log.info("商品上架成功:{}","返回数据{}",succIdList,bulk.toString());
//        为了让大家能感知到如果出错了 返回值是一个布尔值
        return b;
    }
}
